将List转成树的两种方式(递归、循环)

您所在的位置:网站首页 js 列表转树 将List转成树的两种方式(递归、循环)

将List转成树的两种方式(递归、循环)

2024-07-10 09:39| 来源: 网络整理| 查看: 265

在做目录树的时候通常是将一个目录存在数据库的List全部返回来,再根据节点id和parentId组装成一颗树。这里切忌使用递归查询数据库的方式实现,应把对应的目录数据全部查询回来再进行组装。List转成Tree有两种方式,一种是常用的递归,一种是双层循环。

TreeNode.java

package org.massive.tree; import java.util.List; /** * Created by Massive on 2016/12/26. */ public class TreeNode { private String id; private String parentId; private String name; private List children; public TreeNode(String id, String name, String parentId) { this.id = id; this.parentId = parentId; this.name = name; } public TreeNode(String id, String name, TreeNode parent) { this.id = id; this.parentId = parent.getId(); this.name = name; } public String getParentId() { return parentId; } public void setParentId(String parentId) { this.parentId = parentId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public List getChildren() { return children; } public void setChildren(List children) { this.children = children; } @Override public String toString() { return "TreeNode{" + "id='" + id + '\'' + ", parentId='" + parentId + '\'' + ", name='" + name + '\'' + ", children=" + children + '}'; } }

TreeBuilder.java

package org.massive.tree; import java.util.ArrayList; import java.util.List; /** * Created by Massive on 2016/12/26. */ public class TreeBuilder { /** * 两层循环实现建树 * @param treeNodes 传入的树节点列表 * @return */ public static List bulid(List treeNodes) { List trees = new ArrayList(); for (TreeNode treeNode : treeNodes) { if ("0".equals(treeNode.getParentId())) { trees.add(treeNode); } for (TreeNode it : treeNodes) { if (it.getParentId() == treeNode.getId()) { if (treeNode.getChildren() == null) { treeNode.setChildren(new ArrayList()); } treeNode.getChildren().add(it); } } } return trees; } /** * 使用递归方法建树 * @param treeNodes * @return */ public static List buildByRecursive(List treeNodes) { List trees = new ArrayList(); for (TreeNode treeNode : treeNodes) { if ("0".equals(treeNode.getParentId())) { trees.add(findChildren(treeNode,treeNodes)); } } return trees; } /** * 递归查找子节点 * @param treeNodes * @return */ public static TreeNode findChildren(TreeNode treeNode,List treeNodes) { for (TreeNode it : treeNodes) { if(treeNode.getId().equals(it.getParentId())) { if (treeNode.getChildren() == null) { treeNode.setChildren(new ArrayList()); } treeNode.getChildren().add(findChildren(it,treeNodes)); } } return treeNode; } public static void main(String[] args) { TreeNode treeNode1 = new TreeNode("1","广州","0"); TreeNode treeNode2 = new TreeNode("2","深圳","0"); TreeNode treeNode3 = new TreeNode("3","天河区",treeNode1); TreeNode treeNode4 = new TreeNode("4","越秀区",treeNode1); TreeNode treeNode5 = new TreeNode("5","黄埔区",treeNode1); TreeNode treeNode6 = new TreeNode("6","石牌",treeNode3); TreeNode treeNode7 = new TreeNode("7","百脑汇",treeNode6); TreeNode treeNode8 = new TreeNode("8","南山区",treeNode2); TreeNode treeNode9 = new TreeNode("9","宝安区",treeNode2); TreeNode treeNode10 = new TreeNode("10","科技园",treeNode8); List list = new ArrayList(); list.add(treeNode1); list.add(treeNode2); list.add(treeNode3); list.add(treeNode4); list.add(treeNode5); list.add(treeNode6); list.add(treeNode7); list.add(treeNode8); list.add(treeNode9); list.add(treeNode10); List trees = TreeBuilder.bulid(list); List trees_ = TreeBuilder.buildByRecursive(list); } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3